Complex Query, Filtering, এবং Aggregation

Web Development - জ্যাঙ্গো (Django) - Django ডাটাবেস সম্পর্ক এবং ORM কুয়েরি
219

Django ORM (Object-Relational Mapping) আপনাকে ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করতে সাহায্য করে, যাতে আপনি SQL কোড না লিখেও জটিল কুয়েরি, ফিল্টারিং, এবং অ্যাগ্রিগেশন অপারেশন করতে পারেন। Django তে complex queries, filtering, এবং aggregation এর জন্য বিভিন্ন শক্তিশালী ফিচার রয়েছে যা ডেটা ব্যবস্থাপনায় সহজতা আনে।


Complex Query in Django

Django ORM আপনাকে কমপ্লেক্স কুয়েরি তৈরি করার জন্য শক্তিশালী ফিচার সরবরাহ করে। এর মাধ্যমে আপনি জটিল ডেটাবেস কুয়েরি তৈরি করতে পারেন, যেমন জয়েন (JOIN), সাব-কুয়েরি (Subquery), এবং কন্ডিশনাল কুয়েরি (Conditional Query)।

১. Q Objects ব্যবহার করে জটিল কুয়েরি

Q objects Django-তে একটি পদ্ধতি যা বিভিন্ন কন্ডিশনগুলিকে একত্রিত করতে সাহায্য করে, যেমন AND বা OR অপারেটর। Q objects ব্যবহার করে আপনি কন্ডিশনাল কুয়েরি তৈরি করতে পারেন।

উদাহরণ:

from django.db.models import Q
from .models import Product

# যেখানে price 100 এর বেশি অথবা নাম "Laptop"
products = Product.objects.filter(Q(price__gt=100) | Q(name='Laptop'))

এখানে Q(price__gt=100) | Q(name='Laptop') কন্ডিশনটি দুটি শর্তের মধ্যে OR অপারেটর প্রয়োগ করবে। অর্থাৎ, price 100-এর বেশি অথবা name "Laptop" হলে, তা অন্তর্ভুক্ত হবে।

২. সাব-কুয়েরি (Subquery) ব্যবহার

Django ORM সাব-কুয়েরি ব্যবহার করতে সাহায্য করে। উদাহরণস্বরূপ, একটি সাব-কুয়েরি ব্যবহার করে আমরা একক মডেল থেকে নির্দিষ্ট ডেটা পেতে পারি।

from django.db.models import Subquery, OuterRef
from .models import Author, Book

# Authors যাদের বইয়ের সংখ্যা 5 এর বেশি
books_count = Book.objects.filter(author=OuterRef('pk')).count()
authors = Author.objects.annotate(book_count=Subquery(books_count)).filter(book_count__gt=5)

এখানে, Subquery ব্যবহার করে আমরা প্রতিটি Author এর জন্য তার বইয়ের সংখ্যা গণনা করছি এবং শুধুমাত্র সেই Author গুলো ফিল্টার করছি যাদের বইয়ের সংখ্যা 5 এর বেশি।


Filtering in Django

Django ORM আপনাকে বিভিন্ন ধরনের ফিল্টারিং অপারেশন করতে সাহায্য করে। filter() মেথড ব্যবহার করে আপনি ডেটাবেস থেকে নির্দিষ্ট কন্ডিশনের উপর ভিত্তি করে রেকর্ড নির্বাচন করতে পারেন।

১. Filter with Exact Match

# Filter products with exact name "Laptop"
products = Product.objects.filter(name='Laptop')

২. Filter with Range

# Filter products where price is between 50 and 200
products = Product.objects.filter(price__range=(50, 200))

৩. Filter with Case-insensitive Match

# Filter products with name 'laptop', case-insensitive
products = Product.objects.filter(name__iexact='laptop')

৪. Filter with Contains

# Filter products where name contains the word 'Laptop'
products = Product.objects.filter(name__icontains='laptop')

৫. Filter with Foreign Key Relationships

# Filter products that belong to a specific category
products = Product.objects.filter(category__name='Electronics')

এখানে category__name ব্যবহার করে আমরা Product মডেল থেকে সেই সমস্ত প্রোডাক্টস ফিল্টার করছি যেগুলোর category ফিল্ডের নাম "Electronics"।

৬. Filter with Exclusion

# Filter products where name does not contain 'Laptop'
products = Product.objects.exclude(name__icontains='laptop')

এখানে exclude() মেথড ব্যবহার করে আমরা সব প্রোডাক্ট বাদ দিচ্ছি যেগুলোর নাম "Laptop" অন্তর্ভুক্ত।


Aggregation in Django

Aggregation হল একাধিক রেকর্ডের উপরে গণনা (count), গড় (average), সর্বোচ্চ (maximum), সর্বনিম্ন (minimum) ইত্যাদি পরিসংখ্যানিক অপারেশন। Django ORM এ aggregate() মেথড ব্যবহার করে আপনি সহজে অ্যাগ্রিগেশন করতে পারেন।

১. Sum, Average, Count, Min, Max ব্যবহার করা

Django-তে কিছু সাধারণ অ্যাগ্রিগেশন ফাংশন রয়েছে:

  • Sum: একটি ফিল্ডের মানের যোগফল
  • Avg: একটি ফিল্ডের গড়
  • Count: একটি ফিল্ডের মধ্যে রেকর্ডের সংখ্যা
  • Min: একটি ফিল্ডের সর্বনিম্ন মান
  • Max: একটি ফিল্ডের সর্বোচ্চ মান
from django.db.models import Sum, Avg, Count, Max, Min
from .models import Product

# Total price of all products
total_price = Product.objects.aggregate(Sum('price'))

# Average price of all products
average_price = Product.objects.aggregate(Avg('price'))

# Count of all products
total_products = Product.objects.aggregate(Count('id'))

# Maximum and minimum price of products
price_range = Product.objects.aggregate(Max('price'), Min('price'))

২. Multiple Aggregations একত্রে ব্যবহার করা

আপনি একাধিক অ্যাগ্রিগেশন একসাথে করতে পারেন:

# Total price, average price, and count in one query
result = Product.objects.aggregate(
    total_price=Sum('price'),
    average_price=Avg('price'),
    product_count=Count('id')
)

print(result)

এটি একটি ডিকশনারি রিটার্ন করবে, যেখানে total_price, average_price, এবং product_count এর মান থাকবে।

৩. Annotate ব্যবহার করে Aggregation

আপনি annotate() ব্যবহার করে প্রতিটি কিউরি সেটে অ্যাগ্রিগেশন করতে পারেন, যা একটি গ্রুপ অনুযায়ী অ্যাগ্রিগেশন ফিচার সরবরাহ করে।

from django.db.models import Count
from .models import Category

# Categories with the number of products
categories = Category.objects.annotate(num_products=Count('product'))

এখানে annotate() ব্যবহার করে প্রতিটি Category-এর সাথে সংশ্লিষ্ট Product সংখ্যা গণনা করা হয়েছে।


সারাংশ

Django ORM এর মাধ্যমে আপনি জটিল কুয়েরি, ফিল্টারিং এবং অ্যাগ্রিগেশন অপারেশন খুব সহজেই পরিচালনা করতে পারেন। Q objects, filter(), এবং aggregate() এর মতো ফিচারগুলি Django-কে শক্তিশালী ডেটাবেস অপারেশন করতে সহায়তা করে। এর সাহায্যে আপনি ডেটা সহজে বিশ্লেষণ এবং পরিচালনা করতে পারবেন, এবং আপনার অ্যাপ্লিকেশনকে আরও কার্যকরী করতে পারবেন।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...